package cn.edu.jsu.nrs.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;

import cn.edu.jsu.nrs.dao.NewsTypeDao;
import cn.edu.jsu.nrs.model.NewsType;
import cn.edu.jsu.nrs.util.SupportDao;

/**
 * 
 * @author:YYH
 * @date:2013-1-24 下午08:16:28
 * @update-date:2013-1-24 下午08:16:28
 * @version:1.0
 * @project_name:NewsReleaseSystem
 * @description:新闻类别数据访问接口实现
 */
@Component(value = "newsTypesDaoImpl")
public class NewsTypeDaoImpl extends SupportDao implements NewsTypeDao {
	private HibernateTemplate hibernateTemplate;

	// 添加新闻类别
	public int save(NewsType newsType) {
		return (Integer) hibernateTemplate.save(newsType);
	}

	// 修改新闻类别
	public void update(NewsType newsType) {
		hibernateTemplate.update(newsType);
	}

	// 删除新闻类别
	public void delete(NewsType newsType) {
		hibernateTemplate.delete(newsType);
	}

	// 通过新闻类别Id查找新闻类别
	public NewsType queryNewsTypeById(int id) {
		return (NewsType) hibernateTemplate.get(NewsType.class, id);
	}

	/**
	 * 查询当前类别以及父类别列表
	 * 
	 * @param id
	 * @return
	 */
	public List<NewsType> queryNewsTypesById(int id) {
		NewsType newsType = new NewsType();
		newsType = queryNewsTypeById(id);
		List<NewsType> newsTypes = new ArrayList<NewsType>();// 新闻类别列表
		newsTypes.add(newsType);// 把当前类别添加到列表中
		System.out.println(newsType.getTbNewsType());
		if (newsType.getTbNewsType()== null) {// 如果是第一级新闻类别就直接返回新闻类别
			return newsTypes;
		} else {// 递归调用查找新闻类别
			newsTypes = findNewsType(newsTypes, newsType);
			return newsTypes;
		}
	}

	/**
	 * 递归查找所以父类新闻类别
	 * 
	 * @param newsTypesList
	 * @param newsType
	 * @return
	 */
	public List<NewsType> findNewsType(List<NewsType> newsTypesList,
			NewsType newsType) {
		newsType = queryNewsTypeById(newsType.getTbNewsType().getNewsTypeId());
		if (newsType.getTbNewsType() == null) // 如果是顶层新闻类别
		{
			newsTypesList.add(newsType);
			return newsTypesList;
		} else {
			newsTypesList.add(newsType);
			return findNewsType(newsTypesList, newsType);
		}

	}

	/**
	 *  查询子新闻类别
	 */
	@SuppressWarnings("unchecked")
	public List<NewsType> queryChildNewstTypes(int id) {
		return hibernateTemplate.find(
				"from NewsType where parentId=?", id);
	}

	@Resource
	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}
}
